﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace Primitive.Threading.Sync
{
    class InterlockedMaximum
    { 
        public static Int32 Maximum(ref Int32 target, Int32 value)
        {
            Int32 currentVal = target, startVal, desiredVal;
            // 不要在循环中访问(target),除非是因为另一个线程动了它,所以要改变它
            do
            {
                // 记录这一次循环迭代的起始值(stratVal)
                startVal = currentVal;
                // 基于 startVal 和 value计算期望值(desiredVal)
                desiredVal = Math.Max(startVal, value);
                // 注意: 线程在这里可能被抢占(preempted)
                // if (target == startVal) target = desiredVal
                // 在可能的改变之前的值被返回
                currentVal = Interlocked.CompareExchange(ref target, desiredVal, startVal);
                //如果起始值在这一次迭代循环中改变,就重复
            } while (startVal != currentVal);
            // 在这个线程尝试设置它之前返回最大值
            return desiredVal;
        }
    }
}
